#include <STC15F2K60S2.H>
#include "init.h"
#include <Seg.h>
#include <Led.h>
#include <Key.h>
#include <onewire.h>
#include <Delay.h>
#include <iic.h>
unsigned char ucLed[]={0,0,0,0,0,0,0,0};
unsigned char Key_Val,Key_Down,Key_Up,Key_Old;
unsigned long int uwTick;
unsigned char Seg_Pos;
unsigned char Seg_Buf[]={10,10,10,10,10,10,10,10};
unsigned char t;
bit Seg_Mode=0;
bit Set_index=1;
unsigned char Tmax=30,Tmin=20;
unsigned char Tmax_Set,Tmin_Set;

void Key_Proc()
{
	Key_Val=Key_Read();
	Key_Down=Key_Val&(Key_Val^Key_Old);
	Key_Up=~Key_Val&(Key_Val^Key_Old);
	Key_Old=Key_Val;
	
	switch(Key_Down)
	{
		case 4:
			if(Seg_Mode==1)
			{
				if(Tmax_Set>Tmin_Set)
				{
					Tmax=Tmax_Set;
					Tmin=Tmin_Set;
				}
			}
			else
			{
				Tmax_Set=Tmax;
				Tmin_Set=Tmin;
				Set_index=1;
			}
			Seg_Mode^=1;
		break;
		case 5:
			if(Seg_Mode)
				Set_index^=1;
		break;
		case 6:
			if(Seg_Mode)
			{
				if(Set_index==0)
				{
					if(++Tmax_Set==100)Tmax_Set=0;
				}
				else
					if(++Tmin_Set==100)Tmin_Set=0;
			}
		break;
		case 7:
			if(Seg_Mode)
			{
				if(Set_index==0)
				{
					if(--Tmax_Set==255)Tmax_Set=99;
				}
				else
					if(--Tmin_Set==255)Tmin_Set=99;
			}
		break;
	}
}

void Seg_Proc()
{
	//信息获取
	
	
	
	//信息显示
	if(Seg_Mode==0)
	{
		
		Seg_Buf[2]=10;
		Seg_Buf[3]=10;
		Seg_Buf[4]=10;
		Seg_Buf[5]=10;
		Seg_Buf[1]=10;
		Seg_Buf[0]=12;
		Seg_Buf[6]=t/10;
		Seg_Buf[7]=t%10;
	}
	else
	{
		Seg_Buf[0]=13;
		Seg_Buf[1]=10;
		Seg_Buf[2]=10;
		Seg_Buf[3]=Tmax_Set/10;
		Seg_Buf[4]=Tmax_Set%10;
		Seg_Buf[5]=10;
		Seg_Buf[6]=Tmin_Set/10;
		Seg_Buf[7]=Tmin_Set%10;
		
	}
	
}

void Led_Proc()
{
	ucLed[0]=(t>Tmax)?1:0;
	ucLed[1]=(t<=Tmax&&t>=Tmin)?1:0;
	ucLed[2]=(t<Tmin)?1:0;
	Led_Disp(ucLed);
}

void AD_onewire_Proc()
{
	t=rd_temperature();
	if(t>Tmax)
		Da_Write(51*4);
	else if(t>=Tmin)
		Da_Write(51*3);
	else
		Da_Write(51*2);
}
void Timer1_Server()interrupt 3
{
	uwTick++;         // 系统计时增加
	
	Seg_Pos = (++Seg_Pos) % 8; // 更新数码管位置,比原模版更省时间
	 // 数码管显示处理
    if (Seg_Buf[Seg_Pos] > 20)
    Seg_Disp(Seg_Pos, Seg_Buf[Seg_Pos] - ',', 1); // 带小数点
    else
    Seg_Disp(Seg_Pos, Seg_Buf[Seg_Pos], 0); // 无小数点
	
	
	
}

/* 定时器1初始化，1毫秒@12.000MHz */
void Timer1_Init(void)
{
  AUXR &= 0xBF; // 定时器时钟12T模式
  TMOD &= 0x0F; // 设置定时器模式
  TL1 = 0x18;   // 设置定时初始值
  TH1 = 0xFC;   // 设置定时初始值
  TF1 = 0;      // 清除TF1标志
  TR1 = 1;      // 启动定时器1
  ET1 = 1;      // 使能定时器1中断
  EA = 1;       // 使能总中断
}

/* 调度器任务结构体定义 */
typedef struct
{
  void (*task_func)(void);    // 任务函数
  unsigned long int rate_ms;  // 任务执行周期（毫秒）
  unsigned long int last_run; // 任务上次运行时间
} task_t;

/* 调度器任务列表 */
idata task_t Scheduler_Task[] = {
    {Led_Proc, 1, 0},        // LED任务，每1毫秒执行一次
    {Key_Proc, 10, 0},       // 键盘任务，每10毫秒执行一次
    {Seg_Proc, 200, 0},      // 数码管任务，每100毫秒执行一次
	{AD_onewire_Proc , 100 , 0},
};

idata unsigned char task_num;//任务数量


/* 调度器初始化 */
void Scheduler_Init(void)
{
  task_num = sizeof(Scheduler_Task) / sizeof(task_t); // 计算任务数量
}

/* 调度器运行 */
void Scheduler_Run(void)
{
 
  unsigned char i;
  for (i = 0; i < task_num; i++)
  {
    unsigned long int now_time = uwTick; // 获取当前时间
    if (now_time >= (Scheduler_Task[i].last_run + Scheduler_Task[i].rate_ms))
    {
      Scheduler_Task[i].last_run = now_time; // 更新任务上次运行时间
      Scheduler_Task[i].task_func();         // 执行任务
    }
  }
}


void main()
{
	System_Init();
	rd_temperature(); //读取温度
	Delay750ms();     //延时750ms
	Timer1_Init();
	Scheduler_Init();
	while(1)
	{
		Scheduler_Run();
	}
}